package business;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import utils.HibernateUtil;

import entities.Persoon;

public class PersoonZoeker implements IEntityZoeker<Persoon>
{
	/* We kunnen zoeken d.m.v.:
	 * Naam, voornaam, tussenvoegsel,
	 * geboortedatum, postcode, telefoonnummer, email,
	 * rekeningnummer,
	 * gebruikersnaam
	 */
	
	private List<Persoon> results;
	private boolean changed = true; // zoektermen zijn veranderd
	
	private int id;
	
	private String naam;
	private String voornaam;
	private String tussenvoegsel;
	private Calendar geboortedatum;
	
	private String postcode;
	private String telefoonnummer;
	private String email;
	
	private String rekeningnummer;
	private String gebruikersnaam;
	
	// Constructor
	
	public PersoonZoeker()
	{
		
	}

	// Getters en Setters
	
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		changed = true;
		this.id = id;
	}
	public String getNaam()
	{
		return naam;
	}
	public void setNaam(String naam)
	{
		changed = true;
		this.naam = naam;
	}
	public String getVoornaam()
	{
		return voornaam;
	}
	public void setVoornaam(String voornaam)
	{
		changed = true;
		this.voornaam = voornaam;
	}
	public String getTussenvoegsel()
	{
		return tussenvoegsel;
	}
	public void setTussenvoegsel(String tussenvoegsel)
	{
		changed = true;
		this.tussenvoegsel = tussenvoegsel;
	}
	public Calendar getGeboortedatum()
	{
		return geboortedatum;
	}
	public void setGeboortedatum(Calendar geboortedatum)
	{
		changed = true;
		this.geboortedatum = geboortedatum;
	}
	public String getPostcode()
	{
		return postcode;
	}
	public void setPostcode(String postcode)
	{
		changed = true;
		this.postcode = postcode;
	}
	public String getTelefoonnummer()
	{
		return telefoonnummer;
	}
	public void setTelefoonnummer(String telefoonnummer)
	{
		changed = true;
		this.telefoonnummer = telefoonnummer;
	}
	public String getEmail()
	{
		return email;
	}
	public void setEmail(String email)
	{
		changed = true;
		this.email = email;
	}
	public String getRekeningnummer()
	{
		return rekeningnummer;
	}
	public void setRekeningnummer(String rekeningnummer)
	{
		changed = true;
		this.rekeningnummer = rekeningnummer;
	}
	public String getGebruikersnaam()
	{
		return gebruikersnaam;
	}
	public void setGebruikersnaam(String gebruikersnaam)
	{
		changed = true;
		this.gebruikersnaam = gebruikersnaam;
	}
	
	// Methoden
	
	@Override
	public List<Persoon> zoek()
	{
		if(changed)
		{
			Session session = HibernateUtil.getSessionFactory().openSession();
			String queryString = "FROM entities.Persoon";
			
			queryString += getWhereStatements();
			
			System.out.println(queryString);
			
			Query query = session.createQuery(queryString);
			//query.executeUpdate();
			
			results = query.list();
			
			session.close();
			
			changed = false;
		}
		
		return results;
	}
	
	private String getWhereStatements()
	{
		String wh = "";
		
		if(naam != null && !naam.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " naam = \'" + naam + "\'";
		}
		if(voornaam != null && !voornaam.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
		
			wh += " voornaam = \'" + voornaam + "\'";
		}
		if(tussenvoegsel != null && !tussenvoegsel.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " tussenvoegsel = \'" + tussenvoegsel + "\'";
		}
		if(geboortedatum != null)
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			int year = geboortedatum.get(Calendar.YEAR);
			int month = geboortedatum.get(Calendar.MONTH) + 1;
			int day = geboortedatum.get(Calendar.DAY_OF_MONTH);
			
			String datum = String.format(
					"%2d-%2s-%2s",
					year,
					month < 10 ? ("0" + month) : month,
					day < 10 ? ("0" + day) : day);
			wh += " geboortedatum = \'" + datum + "\'";
		}
		if(postcode != null && !postcode.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " postcode = \'" + postcode + "\'";
		}
		if(telefoonnummer != null && !telefoonnummer.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " telefoonnummer = \'" + telefoonnummer + "\'";
		}
		if(email != null && !email.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " email = \'" + email + "\'";
		}
		if(rekeningnummer != null && !rekeningnummer.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " rekeningnummer = \'" + rekeningnummer + "\'";
		}
		if(gebruikersnaam != null && !gebruikersnaam.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " gebruikersnaam = \'" + gebruikersnaam + "\'";
		}
		
		if(!wh.isEmpty())
		{
			wh = " WHERE" + wh;
		}
		
		return wh;
	}
}
